/*
Dart中抽象类: Dart抽象类主要用于定义标准，子类可以继承抽象类，也可以实现抽象类接口。


  1、抽象类通过abstract 关键字来定义

  2、Dart中的抽象方法不能用abstract声明，Dart中没有方法体的方法我们称为抽象方法。

  3、如果子类继承抽象类必须得实现里面的抽象方法

  4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。

  5、抽象类不能被实例化，只有继承它的子类可以

extends抽象类 和 implements的区别：

  1、如果要复用抽象类里面的方法，并且要用抽象方法约束自类的话我们就用extends继承抽象类

  2、如果只是把抽象类当做标准的话我们就用implements实现抽象类


多态就是父类定义一个方法不去实现，让继承他的子类去实现，每个子类有不同的表现。 
  抽象类就是一个多态.

案例：定义一个Animal 类要求它的子类必须包含eat方法
*/

// 在抽象类里 不写方法体 那就是抽象方法
abstract class Animal {
  eat(); // 在抽象类里 不写方法体 那就是抽象方法
  run(); //抽象方法
  printInfo() {
    print('我是一个抽象类里面的普通方法');
  }
}

// 在子类里面 继承的抽象方法 必须实现
class Dog extends Animal {
  // 也是多态 父类定义的方法 在子类实现
  @override
  eat() {
    print('dog eat');
  }

  @override
  run() {
    print('dog run');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('cat eat');
  }

  @override
  run() {
    print('cat run');
  }
}

main() {
  // 实例化子类
  Dog d = new Dog();
  // 调用子类里的抽象方法
  d.eat();
}
